package com.rc.saas.tenant.utils;


import com.rc.saas.tenant.vo.tenant.TreeModel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BuildTreeUtil {
    /**
     * 构建整个树
     *
     * @param nodes
     * @param <T>
     * @return
     */
    public static <T> TreeModel<T> build(List<TreeModel<T>> nodes) {
        if (nodes == null) {
            return null;
        }
        List<TreeModel<T>> topNodes = new ArrayList<TreeModel<T>>();

        //生成根层
        for (TreeModel<T> children : nodes) {
            String pid = children.getParentId();
            if (pid == null || "0".equals(pid)) {
                topNodes.add(children);

                continue;
            }

            //在根层下生成子层
            for (TreeModel<T> parent : nodes) {
                String id = parent.getId();
                if (id != null && id.equals(pid)) {
                    parent.getChildren().add(children);
                    children.setHasParent(true);
                    parent.setHasChildren(true);
                    continue;
                }
            }
        }

        //设置属性
        TreeModel<T> root = new TreeModel<T>();
        if (topNodes.size() == 1) {
            root = topNodes.get(0);
        } else {
            root.setId("-1");
            root.setParentId("");
            root.setHasParent(false);
            root.setHasChildren(true);
            root.setChecked(true);
            root.setChildren(topNodes);
            root.setText("顶级节点");
            Map<String, Object> state = new HashMap<>(16);
            state.put("opened", true);
            root.setState(state);
        }

        return root;
    }

    /**
     * 根据ID构建子树
     *
     * @param nodes
     * @param idParam
     * @param <T>
     * @return
     */
    public static <T> List<TreeModel<T>> buildList(List<TreeModel<T>> nodes, String idParam) {
        if (nodes == null) {
            return null;
        }
        List<TreeModel<T>> topNodes = new ArrayList<TreeModel<T>>();

        for (TreeModel<T> children : nodes) {

            String pid = children.getParentId();
            if (pid == null || idParam.equals(pid)) {
                topNodes.add(children);

                continue;
            }

            for (TreeModel<T> parent : nodes) {
                String id = parent.getId();
                if (id != null && id.equals(pid)) {
                    parent.getChildren().add(children);
                    children.setHasParent(true);
                    parent.setHasChildren(true);

                    continue;
                }
            }

        }
        return topNodes;
    }

    /////////////////////////////////////////////
    public static <T> TreeModel<T> buildWholeTree(List<TreeModel<T>> list) {
        if (list == null) {
            return null;
        }

        //parentId上级组织ID，一级组织为0
        List<TreeModel<T>> topNodes = buildWholeTree(list, "0");

        //设置属性
        TreeModel<T> root = new TreeModel<T>();
        if (topNodes.size() == 1) {
            root = topNodes.get(0);
        } else {
            root.setId("-1");
            root.setParentId("");
            root.setHasParent(false);
            root.setHasChildren(true);
            root.setChecked(true);
            //设置子树
            root.setChildren(topNodes);
            root.setText("顶级节点");
            Map<String, Object> state = new HashMap<>(16);
            state.put("opened", true);
            root.setState(state);
        }

        return root;
    }

    public static <T> List<TreeModel<T>> buildWholeTree(List<TreeModel<T>> list, String parentId) {
        //List<Menu> menus=new ArrayList<Menu>();
        List<TreeModel<T>> nodes = new ArrayList<TreeModel<T>>();

        //for (Menu menu : list) {
        for (TreeModel<T> node : list) {

            String menuId = node.getId();
            String pid = node.getParentId();

            //parentId上级组织ID，一级组织为0
            if (parentId.equals(pid)) {
                List<TreeModel<T>> menuLists = buildWholeTree(list, menuId);

                node.setChildren(menuLists);
                nodes.add(node);
            }
        }

        return nodes;
    }

    /**
     * 递归
     *
     * @param nodes
     * @param <T>
     * @return
     */
    //public static <T> TreeVo<T> buildTree0(List<TreeVo<T>> nodes) {
    //    if (nodes == null) {
    //        return null;
    //    }
    //    List<TreeVo<T>> topNodes = new ArrayList<TreeVo<T>>();
    //
    //    //根层
    //    for (TreeVo<T> children : nodes) {
    //        String pid = children.getParentId();
    //        if (pid == null || "0".equals(pid)) {
    //            topNodes.add(children);
    //
    //            continue;
    //        }
    //
    //        //子层
    //        for (TreeVo<T> parent : nodes) {
    //            String id = parent.getId();
    //            if (id != null && id.equals(pid)) {
    //                parent.getChildren().add(children);
    //                children.setHasParent(true);
    //                parent.setChildren(true);
    //                continue;
    //            }
    //        }
    //    }
    //
    //    //设置属性
    //    TreeVo<T> root = new TreeVo<T>();
    //    if (topNodes.size() == 1) {
    //        root = topNodes.get(0);
    //    } else {
    //        root.setId("-1");
    //        root.setParentId("");
    //        root.setHasParent(false);
    //        root.setChildren(true);
    //        root.setChecked(true);
    //        root.setChildren(topNodes);
    //        root.setText("顶级节点");
    //        Map<String, Object> state = new HashMap<>(16);
    //        state.put("opened", true);
    //        root.setState(state);
    //    }
    //
    //    return root;
    //}

    //public static List<TreeVo<T>> buildTree1(List<TreeVo<T>> nodes) {
    //    List<TreeVo<T>> topNodes = new ArrayList<TreeVo<T>>();
    //
    //    //列表
    //    for (TreeVo<T> parent0 : nodes) {
    //        //根层
    //        String pid = parent0.getParentId();
    //        if (pid == null || "0".equals(pid)) {
    //            topNodes.add(parent0);
    //
    //            continue;
    //        }
    //
    //        //子层
    //        for (TreeVo<T> children : nodes) {
    //            String id = children.getId();
    //            if (id != null && id.equals(pid)) {
    //                children.getChildren().add(parent0);
    //                parent0.setHasParent(true);
    //                children.setChildren(true);
    //                continue;
    //            }
    //        }
    //    }
    //
    //    return topNodes;
    //}

    //public static <T> TreeVo<T> buildTree2(TreeVo<T> nodes) {
    //    //子层
    //    for (TreeVo<T> parent : nodes) {
    //        String id = parent.getId();
    //        if (id != null && id.equals(pid)) {
    //            parent.getChildren().add(children);
    //            children.setHasParent(true);
    //            parent.setChildren(true);
    //            continue;
    //        }
    //    }
    //}

}